package com.alibaba.algo.controller.user;

import com.alibaba.algo.annotation.OperateLogAnnotation;
import com.alibaba.algo.apiimpl.user.SysOrgServiceImpl;
import com.alibaba.algo.cooperation.common.BaseResult;
import com.alibaba.algo.cooperation.common.PagerEntity;
import com.alibaba.algo.cooperation.usercenter.GlobalResultStatus;
import com.alibaba.algo.cooperation.usercomponent.vo.req.user.*;
import com.alibaba.algo.cooperation.usercomponent.vo.res.user.GetChildOrgListByParentIdResponseVO;
import com.alibaba.algo.cooperation.usercomponent.vo.res.user.GetFirstLevelOrgResponseVO;
import com.alibaba.algo.enums.OperateTypeEnum;
import com.alibaba.algo.enums.ResourceTypeEnum;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 类SysOrgController.java的实现描述：组织机构 Controller
 *
 * @author nieganggang 2021-03-12 16:08:17
 */
@RestController
@RequestMapping(value = "/usercenter-admin-app/admin/sysOrg")
@Api(value = "组织管理", tags = "组织管理")
public class SysOrgController {

    @Autowired
    private SysOrgServiceImpl sysOrgService;

    /**
     * 新增组织
     *
     * @param sysOrgCreateRequestVO 新增组织参数
     * @return 新增结果
     */
    @PostMapping("/insert")
    @ApiOperation(value = "新增组织")
    public BaseResult insert(@RequestBody SysOrgCreateRequestVO sysOrgCreateRequestVO) {
        if (StringUtils.isEmpty(sysOrgCreateRequestVO.getOrgName().trim())) {
            return BaseResult.buildError(GlobalResultStatus.PARAM_SYS_ORG_NAME_ERROR.getCode(), GlobalResultStatus.PARAM_SYS_ORG_NAME_ERROR.getMsg());
        }
        if (StringUtils.isEmpty(sysOrgCreateRequestVO.getOrgType())) {
            return BaseResult.buildError(GlobalResultStatus.PARAM_SYS_ORG_TYPE_ERROR.getCode(), GlobalResultStatus.PARAM_SYS_ORG_TYPE_ERROR.getMsg());
        }
        if (StringUtils.isEmpty(sysOrgCreateRequestVO.getExpireStartTime())) {
            return BaseResult.buildError(GlobalResultStatus.PARAM_SYS_ORG_ExpireStarttime_ERROR.getCode(), GlobalResultStatus.PARAM_SYS_ORG_ExpireStarttime_ERROR.getMsg());
        }
        return sysOrgService.insert(sysOrgCreateRequestVO);
    }

    /**
     * 删除组织  逻辑删除
     *
     * @param sysOrgDelRequestVO 删除某个组织
     * @return 删除结果
     */
    @PostMapping("/delete")
    @ApiOperation(value = "删除组织")
    @OperateLogAnnotation(resouceType = ResourceTypeEnum.ORG,operateType = OperateTypeEnum.DELETE)
    public BaseResult delete(@RequestBody SysOrgDelRequestVO sysOrgDelRequestVO) {
        if (StringUtils.isEmpty(sysOrgDelRequestVO.getOrgId())) {
            return BaseResult.buildError(GlobalResultStatus.PARAM_SYS_ORG_ID_ERROR.getCode(), GlobalResultStatus.PARAM_SYS_ORG_ID_ERROR.getMsg());
        }
        return sysOrgService.delete(sysOrgDelRequestVO);
    }

    /**
     * 更新组织
     *
     * @param sysOrgUpdateRequestVO 更新组织参数
     * @return 更新结果
     */
    @PostMapping("/update")
    @ApiOperation(value = "更新组织")
    public BaseResult update(@RequestBody SysOrgUpdateRequestVO sysOrgUpdateRequestVO) {
        if (StringUtils.isEmpty(sysOrgUpdateRequestVO.getId())) {
            return BaseResult.buildError(GlobalResultStatus.PARAM_SYS_ORG_ID_ERROR.getCode(), GlobalResultStatus.PARAM_SYS_ORG_ID_ERROR.getMsg());
        }
        return sysOrgService.update(sysOrgUpdateRequestVO);
    }

    /**
     * 获取所有的一级组织
     *
     * @return 一级组织列表
     */
    @PostMapping("/getFirstLevelOrgList")
    @ApiOperation(value = "获取所有的一级组织")
    public BaseResult getFirstLevelOrgList() {
        List<GetFirstLevelOrgResponseVO> resList = sysOrgService.getFirstLevelOrgList();
        return BaseResult.buildSuccess(resList);
    }

    /**
     * 获取所有的子组织
     *
     * @param vo 子组织入参
     * @return 子组织列表
     */
    @PostMapping("/getChildOrgListByParentId")
    @ApiOperation(value = "获取所有的子组织")
    public BaseResult getChildOrgListByParentId(@RequestBody GetChildOrgListByParentIdRequestVO vo) {
        if (StringUtils.isEmpty(vo.getParentId())) {
            return BaseResult.buildError(GlobalResultStatus.PARAM_SYS_PARENT_ORG_ID_ERROR.getCode(), GlobalResultStatus.PARAM_SYS_PARENT_ORG_ID_ERROR.getMsg());
        }
        List<GetChildOrgListByParentIdResponseVO> childOrgList = sysOrgService.getChildOrgListByParentId(vo);
        return BaseResult.buildSuccess(childOrgList);
    }

    /**
     * 组织列表分页查询
     *
     * @param vo 组织列表分页入参
     * @return 分页数据
     */
    @PostMapping("/selectPage")
    @ApiOperation(value = "组织列表分页查询")
    public BaseResult selectList(@RequestBody SelectOrgListRequestVO vo) {
        PagerEntity pagerEntity = sysOrgService.selectPage(vo);
        return BaseResult.buildSuccess(pagerEntity);
    }

    @PostMapping(value = "qryChildOrgListByParentId")
    @ApiOperation(value = "获取子级组织列表")
    public BaseResult qryChildOrgListByParentId(@RequestBody GetChildOrgListByParentIdRequestVO vo) {
        return sysOrgService.qryChildOrgListByParentId(vo);
    }


    @GetMapping(value = "sort/{sort}")
    @ApiOperation(value = "检查排序序列是否已经存在")
    public BaseResult checkOrgSort(@PathVariable("sort") Integer sort) {
        return sysOrgService.checkSort(sort);
    }


    @PostMapping(value = "qryChildOrgListByParentIdRecursion")
    @ApiOperation(value = "递归获取子级组织列表")
    public BaseResult qryChildOrgListByParentIdRecursion(@RequestBody GetChildOrgListByParentIdRequestVO vo) {
        return sysOrgService.qryChildOrgListByParentIdRecursion(vo);
    }
}
